home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / mus / play / splib43U.lha / superplay-lib_USR / SuperPlay / SP_SPOListSubs.c < prev    next >
C/C++ Source or Header  |  1994-12-13  |  3KB  |  124 lines

  1.  
  2.  /* SP_SPOListSubs.c
  3.     - Functions for spobject List Handling -
  4.     (c) 1993-94 by Andreas R. Kleinert
  5.     Last changes : 21.07.1994
  6.  */
  7.  
  8. #include "SuperPlay.h"
  9.  
  10.  
  11.  /* spobject List Handling Functions */
  12.  
  13. struct SPS_SPOList *  __regargs SPS_GetSPOList(void);
  14. void                  __regargs SPS_FreeSPOList(struct SPS_SPOList *SPOList);
  15. long                  __regargs SPS_AddSPOEntry(struct SPS_SPOList *mlist,  struct SPO_ObjectNode *spo_node);
  16. struct SPS_SPOEntry * __regargs SPS_GetSPOEntry(struct SPS_SPOList *SPOList, long entrynum);
  17.  
  18.  
  19. struct SPS_SPOList * __regargs SPS_GetSPOList(void)
  20. {
  21.  struct List           *obj_list = N;
  22.  struct SPS_SPOList    *SPOList  = N;
  23.  struct List           *samelist = N;
  24.  struct SPO_ObjectNode *spo_node = N;
  25.  struct SPS_SPOEntry   *entry    = N;
  26.  
  27.  samelist = (struct List *) AllocVec(sizeof(struct SPS_SPOList), (MEMF_CLEAR|MEMF_PUBLIC));
  28.  if(samelist)
  29.   {
  30.    SPOList = (APTR) samelist;
  31.  
  32.    SPOList->spl_NumEntries = 0;
  33.  
  34.    samelist->lh_Head     = (struct Node *) &(samelist->lh_Tail);
  35.    samelist->lh_Tail     = N;
  36.    samelist->lh_TailPred = (struct Node *) &(samelist->lh_Head);
  37.    samelist->lh_Type     = NT_UNKNOWN;
  38.   }else return(NULL);
  39.  
  40.  obj_list = (APTR) &SuperPlayBase->spb_SPObjectList;
  41.  if(!obj_list) return(SPOList);
  42.  
  43.  for(spo_node=(APTR) obj_list->lh_Head;(spo_node)&&(spo_node!=(APTR) &(obj_list->lh_Tail));)
  44.   {
  45.    if(spo_node->spo_ObjectType == SPO_OBJECTTYPE_SAMPLE) SPS_AddSPOEntry(SPOList, spo_node);
  46.  
  47.    spo_node = (APTR) ((struct Node *)spo_node)->ln_Succ;
  48.   }
  49.  
  50.  return(SPOList);
  51. }
  52.  
  53. void __regargs SPS_FreeSPOList(struct SPS_SPOList *SPOList)
  54. {
  55.  struct SPS_SPOEntry *entry;
  56.  
  57.  if(SPOList)
  58.   {
  59.    for(entry=(APTR) SPOList->spl_EntryList.lh_Head;(entry)&&(entry!=(APTR) &(SPOList->spl_EntryList.lh_Tail));)
  60.     {
  61.      Remove((APTR) entry);
  62.      FreeVec(entry);
  63.  
  64.      entry = (APTR) SPOList->spl_EntryList.lh_Head;
  65.     }
  66.  
  67.    FreeVec(SPOList);
  68.   }
  69. }
  70.  
  71. long __regargs SPS_AddSPOEntry(struct SPS_SPOList *mlist, struct SPO_ObjectNode *spo_node)
  72. {
  73.  struct SPS_SPOEntry *entry;
  74.  UBYTE i;
  75.  
  76.  if(!mlist || !spo_node) return(FALSE);
  77.  
  78.  for(i=0; i<spo_node->spo_SubTypeNum; i++)
  79.   {
  80.    entry = (APTR) AllocVec(sizeof(struct SPS_SPOEntry), ((MEMF_CLEAR|MEMF_PUBLIC)|MEMF_PUBLIC));
  81.    if(!entry) return(FALSE);
  82.  
  83.    mlist->spl_NumEntries++;
  84.  
  85.    strcpy(entry->spe_ObjectID, spo_node->spo_TypeID);
  86.    strcat(entry->spe_ObjectID, " ");
  87.    strcat(entry->spe_ObjectID, spo_node->spo_SubTypeID[i]);
  88.  
  89.    entry->spe_ObjectCode     = spo_node->spo_TypeCode;
  90.    entry->spe_ObjectSubCode  = spo_node->spo_SubTypeCode[i];
  91.  
  92.    entry->spe_SPO_ObjectNode = spo_node;
  93.  
  94.    ((struct Node *)entry)->ln_Name = entry->spe_ObjectID;
  95.  
  96.    AddTail((APTR)mlist, (APTR)entry);
  97.   }
  98.  
  99.  return(TRUE);
  100. }
  101.  
  102. struct SPS_SPOEntry * __regargs SPS_GetSPOEntry(struct SPS_SPOList *SPOList, long entrynum)
  103. {
  104.  struct SPS_SPOEntry *entry;
  105.  struct SPS_SPOEntry *ret_entry = N;
  106.  ULONG i = 0;
  107.  
  108.  if(!SPOList) return(N);
  109.  
  110.  for(entry=(APTR) SPOList->spl_EntryList.lh_Head;(entry)&&(entry!=(APTR) &(SPOList->spl_EntryList.lh_Tail));)
  111.   {
  112.    if(i == entrynum)
  113.     {
  114.      ret_entry = entry;
  115.  
  116.      break;
  117.     }
  118.  
  119.    entry = (APTR) ((struct Node *)entry)->ln_Succ; i++;
  120.   }
  121.  
  122.  return(ret_entry);
  123. }
  124.